package main

import (
	"fmt"
	"strconv"
	"strings"
)

// 一次性声明多个变量
var (
	a = 1
	b = 2
)

// 本教程地址：https://learn.lianglianglee.com/%e4%b8%93%e6%a0%8f/22%20%e8%ae%b2%e9%80%9a%e5%85%b3%20Go%20%e8%af%ad%e8%a8%80-%e5%ae%8c/00%20%e5%bc%80%e7%af%87%e8%af%8d%20%20Go%20%e4%b8%ba%e5%bc%80%e5%8f%91%e8%80%85%e7%9a%84%e9%9c%80%e6%b1%82%e8%ae%be%e8%ae%a1%ef%bc%8c%e5%b8%a6%e4%bd%a0%e5%ae%9e%e7%8e%b0%e9%ab%98%e6%95%88%e5%b7%a5%e4%bd%9c.md
func main() {
	//变量定义：var 变量名 类型 = 表达式
	var i int = 10
	fmt.Println(i)

	//变量类型自动推导
	var j = 20
	fmt.Println(j)

	fmt.Println(a)
	fmt.Println(b)

	//浮点型：常用float64，精度更高
	fmt.Println("******浮点型******")
	var f32 float32 = 2.23456789
	var f64 float64 = 10.3456789
	fmt.Println(f32)
	fmt.Println(f64)

	//布尔型
	fmt.Println("******布尔型******")
	var bf bool = false
	var bt bool = true
	fmt.Println(bf)
	fmt.Println(bt)

	//字符串
	fmt.Println("******字符串******")
	var s1 string = "Hello"
	var s2 string = "世界"
	fmt.Println("s1+s2=", s1+s2)

	//零值
	fmt.Println("******零值******")
	var zi int
	var zf float64
	var zb bool
	var zs string
	fmt.Println(zi, zf, zb, zs)

	//变量简短声明，格式：变量名 := 表达式
	fmt.Println("******变量简短声明******")
	aa := 10
	bb := false
	cc := "Hello"
	fmt.Println(aa, bb, cc)

	//指针
	//在go语言中，指针对应的是变量在内存中的存储位置，也就是说指针的值就是变量的内存地址。
	//可以通过&获取一个变量的地址，也就是指针。
	//通过*获取指针指向的变量值
	fmt.Println("******指针******")
	pi := &i
	fmt.Println("指针的值（内存地址）", pi)
	fmt.Println("指针指向的变量值", *pi)
	*pi = 20
	fmt.Println("变量i的值", i)
	fmt.Println("*pi指针指向的变量值", *pi)

	//常量：常量定义关键字const
	fmt.Println("******常量******")
	const name = "宋发元"
	fmt.Println("常量输出：", name)

	//字符串
	fmt.Println("******字符串******")
	i2s := strconv.Itoa(i)        //int转string
	s2i, err := strconv.Atoi(i2s) //string转int
	fmt.Println("类型转换输出：", i2s, s2i, err)
	//强制转换：可能会丢失精度
	i2f := float64(i)
	fmt.Println("强制类型转换：", i2f)
	//strings包
	fmt.Println(strings.HasPrefix(s1, "H")) //判断s1的前缀是否是H
	fmt.Println(strings.Index(s1, "o"))     //在s1中查找字符串o
	fmt.Println(strings.ToUpper(s1))        //把s1全部转为大写
}
